from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
import sys
import time
import ExceInit
import os
import ToolFun
import config
import SetTestParameter

# 电流测试主界面
class MainWindowCurrent:
    def __init__(self):
        self.InitDevice = config.get_init_devic1e_value()  # 初始化测试类型
        self.fine_add = config.get_fine_add_value()  # 获取文件储存起始地址
        self.res = config.get_device_res_value()  # 获取文件标识符
        # 动态加载UI文件
        self.ui = QUiLoader().load("./UI/TestCurrentUI.ui")  # 主界面文件
        self.ui.setWindowTitle("【古鑫】安捷伦34465 电流测试软件 V1.0 ")
        self.set_parameter_window = None
        self.help_tool_window = None
        self.about_tool_window = None

        # 【查询历史数据】点击槽函数
        self.ui.OpenFineTool.triggered.connect(self.open_fine_fool)
        # 【退出】点击槽函数
        self.ui.ExitTool.triggered.connect(self.exit_tool)
        # 【帮助信息】点击槽函数
        self.ui.HelpTool.triggered.connect(self.help_tool)
        # 【关于】点击槽函数
        self.ui.AboutTool.triggered.connect(self.about_tool)

        # 联机初始化测试
        self.test_link()
        # 【联机测试】点击槽函数
        self.ui.LinkTest.clicked.connect(self.test_link)
        # 【设置测试参数】点击槽函数
        self.ui.SetTestParameterButt.clicked.connect(self.set_parameter_ui)
        # 【SN输入框回车】槽函数
        self.ui.lineEdit.returnPressed.connect(self.text_enter)
        # 【开始测试】槽函数
        self.ui.StartTest.clicked.connect(self.text_enter)


    # 【查询历史数据】
    def open_fine_fool(self):
        os.startfile(self.fine_add)

    # 【退出】
    def exit_tool(self):
        app = config.get_app_value()
        sys.exit(app.exec_())

    # 【帮助信息】
    def help_tool(self):
        self.help_tool_window = ToolFun.HelpTool()
        self.help_tool_window.HelpTool.show()

    # 【关于】
    def about_tool(self):
        self.about_tool_window = ToolFun.AboutTool()
        self.about_tool_window.AboutTool.show()

    # 【联机测试】
    def test_link(self):
        ToolFun.test_link(self.ui)

    # 点击设置参数按钮后
    def set_parameter_ui(self):
        self.set_parameter_window = SetTestParameter.SetTestParameterWindowCurrent()
        self.set_parameter_window.SetTestParameter.show()

    # SN文本回车后 & 点击开始测试槽函数
    def text_enter(self):
        self.table_data_write()  #启动测试
        self.ui.lineEdit.clear() #清除原本文本框的SN号

    # 启动测试槽函数
    def table_data_write(self):

        # 获取基础内容&和SN号
        test_parameter = config.get_test_parameter_value()  # 获取初始化测试内容
        number = config.get_number_value()  # 获取初始的序列号
        self.res = config.get_device_res_value()  # 获取文件标识符
        excel_name = config.get_excel_name_value() #获取Excel名字

        sn = ExceInit.SnData(excel_name)
        text = self.ui.lineEdit.text()  # 读取SN内容
        sys_time = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 获取当前时间

        # 判断长度是否合格，合格后启动测试
        if len(text) == int(test_parameter['SNLenSpinBox']):  # 判断SN长度是否正确
            test_crr_data = self.res.query("MEAS:current:DC?")  # 开启设备测试

            # 符合电流标准的
            if (float(test_parameter['MinData'])*0.000001) <= float(test_crr_data) <= (float(test_parameter['MaxData'])*0.000001):

                # 输出序列号,UI界面和excel都增加列号
                ExceInit.ui_excel_write(self.ui, str(text))
                # 输出电流,UI界面和excel都增加列号
                ExceInit.ui_excel_write(self.ui, '%.4f'%(float(test_crr_data)*1000000))
                # 输出OK值,UI界面和excel都增加列号
                ExceInit.ui_excel_write(self.ui, 'PASS')
                # 输出测试时间,UI界面和excel都增加列号
                ExceInit.ui_excel_write(self.ui, sys_time)

                # 软件界面满数据下滚
                number = int(number) + 1
                config.change_number_value(number)
                if number>=12:  # 如果UI已经占满了12行，则插入新行&页面下滚
                    self.ui.TestData.insertRow(number)
                    self.ui.TestData.scrollToBottom()

                # 记录测试过的SN号，EXCEL的行号，以字典的形式储存到列表中
                config.sn_list_append_value(sn.save_sn(text, config.get_excel_row_value()))
                # 传入SN列表字典，如果SN号已经存在的，删除EXCEL对应行。
                sn_list = config.get_sn_list_value()  # 获取SN储存列表
                sn.sn_judeg(text, sn_list)
                # UI和EXCEL坐标重新置位
                config.reset_ui_excel_coordinate()
                # 更新ng统计到UI
                config.change_ok_result_statistics_value(self.ui)
            # 不符合电流测试标准的
            else:
                # 保存NG数据的
                if str(test_parameter['SaveNGcheck']) == 'PySide2.QtCore.Qt.CheckState.Checked':

                    # 输出序列号,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, str(text))
                    # 输出电流,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, '%.4f'%(float(test_crr_data)*1000000))
                    # 输出NG值,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, 'NG')
                    # 输出测试时间,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, sys_time)

                    # 软件界面满数据下滚
                    number = int(number) + 1
                    config.change_number_value(number)
                    if number>=12:
                        self.ui.TestData.insertRow(number)
                        self.ui.TestData.scrollToBottom()

                    # UI和EXCEL坐标重新置位
                    config.reset_ui_excel_coordinate()
                    # 测试NG设备发出报警声音 & 软件弹出提示框
                    ToolFun.ng_warning(self.res, self.ui, "测试异常", "#测试NG#")
                    # 更新ng统计到UI
                    config.change_ok_result_statistics_value(self.ui)

                # 不保存NG数据
                elif str(test_parameter['SaveNGcheck']) == 'PySide2.QtCore.Qt.CheckState.Unchecked':

                    # 输出序列号,UI界面和excel都增加列号
                    ExceInit.ui_write(self.ui, str(text))
                    # 输出电压,UI界面和excel都增加列号
                    ExceInit.ui_write(self.ui, '%.4f'%(float(test_crr_data)*1000000))
                    # 输出NG值,UI界面和excel都增加列号
                    ExceInit.ui_write(self.ui, 'NG')
                    # 输出测试时间,UI界面和excel都增加列号
                    ExceInit.ui_write(self.ui, sys_time)
                    # 更新ng统计到UI
                    config.change_ng_result_statistics_value(self.ui)

                    # 软件界面满数据下滚
                    number = int(number) + 1
                    config.change_number_value(number)
                    if number>=12:
                        self.ui.TestData.insertRow(number)
                        self.ui.TestData.scrollToBottom()

                    # UI坐标重新置位
                    config.reset_ui_coordinate()
                    # 测试NG设备发出报警声音 & 软件弹出提示框
                    ToolFun.ng_warning(self.res, self.ui, "测试异常", "#测试NG#")

        else:
            QtWidgets.QMessageBox.critical(self.ui, "SN异常", "# 扫描的SN长度与设置的不一致 #\
                                                                         \n  # 或者未进行设置测试参数 #")
